﻿
namespace RealidadeAumentada.Entidades
{
    public class EPontoDuplo2D
    {
        public double x;
	    public double y;

        #region Construtor
        public EPontoDuplo2D()
        {
            this.x = 0;
            this.y = 0;
        }

        public EPontoDuplo2D(double i_x, double i_y)
        {
            this.x = i_x;
            this.y = i_y;
            return;
        }

        public EPontoDuplo2D(EPontoDuplo2D i_src)
        {
            this.x = i_src.x;
            this.y = i_src.y;
            return;
        }

        public EPontoDuplo2D(EPontoInteiro2D i_src)
        {
            this.x = (double)i_src.x;
            this.y = (double)i_src.y;
            return;
        }
        #endregion

        #region Setar Valor
        public void SetarValor(EPontoDuplo2D i_src)
        {
            this.x = i_src.x;
            this.y = i_src.y;

            return;
        }

        public void SetarValor(EPontoInteiro2D i_src)
        {
            this.x = (double)i_src.x;
            this.y = (double)i_src.y;

            return;
        }

        public void SetarValor(double x, double y)
        {
            this.x = x;
            this.y = y;

            return;
        }
        #endregion

        #region Arrays
        public static EPontoDuplo2D[] CriarArray(int Tamanho)
        {
            EPontoDuplo2D[] PD2D = new EPontoDuplo2D[Tamanho];

            for (int i = 0; i < Tamanho; i++)
            {
                PD2D[i] = new EPontoDuplo2D();
            }

            return PD2D;
        }

        public static EPontoDuplo2D[][] CriarArrayBidimensional(int TamanhoX, int TamanhoY)
        {
            EPontoDuplo2D[][] PD2D = new EPontoDuplo2D[TamanhoY][];
            for (int i = 0; i < TamanhoY; i++)
            {
                PD2D[i] = new EPontoDuplo2D[TamanhoX];

                for (int i2 = 0; i2 < TamanhoX; i2++)
                {
                    PD2D[i][i2] = new EPontoDuplo2D();
                }
            }

            return PD2D;
        }

        #endregion

        #region Cruzes
        public static double CruzProduto3Pontos(EPontoDuplo2D p1, EPontoDuplo2D p2, EPontoDuplo2D p3)
        {
            return (p2.x - p1.x) * (p3.y - p2.y) - (p2.y - p1.y) * (p3.x - p2.x);
        }

        public static double CruzProduto3Pontos(EPontoDuplo2D p1, EPontoDuplo2D p2, double p3_x, double p3_y)
        {
            return (p2.x - p1.x) * (p3_y - p2.y) - (p2.y - p1.y) * (p3_x - p2.x);
        }
        #endregion

        #region Centralizar
        public static void Centralizar(EPontoDuplo2D[] Pontos, int Tamanho, EPontoDuplo2D Objeto)
        {
            double x, y;
            x = y = 0;
            for (int i = Tamanho - 1; i >= 0; i--)
            {
                x += Pontos[i].x;
                y += Pontos[i].y;
            }
            Objeto.x = x / Tamanho;
            Objeto.x = y / Tamanho;
        }

        public static void Centralizar(EPontoDuplo2D[] Pontos, int Tamanho, EPontoInteiro2D Objeto)
        {
            double lx, ly;
            lx = ly = 0;
            for (int i = Tamanho - 1; i >= 0; i--)
            {
                lx += Pontos[i].x;
                ly += Pontos[i].y;
            }
            Objeto.x = (int)(lx / Tamanho);
            Objeto.y = (int)(ly / Tamanho);
        }
        #endregion

        #region Distância do Quadrado
        public double DistanciaQuadrado(EPontoDuplo2D i_p1)
        {
            double x, y;
            x = this.x - i_p1.x;
            y = this.y - i_p1.y;
            return x * x + y * y;
        }

        public double DistanciaQuadrado(EPontoInteiro2D i_p1)
        {
            double x, y;
            x = this.x - i_p1.x;
            y = this.y - i_p1.y;
            return x * x + y * y;
        }
        #endregion
    }
}
